package top.lshaci.learning.alibaba.cloud.sentinel.hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import top.lshaci.learning.alibaba.cloud.sentinel.hello.config.HelloSentinelConfig;
import top.lshaci.learning.alibaba.cloud.sentinel.hello.feign.EchoService;
import top.lshaci.learning.alibaba.cloud.sentinel.hello.service.CustomService;
import top.lshaci.learning.alibaba.cloud.sentinel.hello.service.HelloService;

/**
 * SentinelHelloApplication
 * 1、整合Sentinel
 *  1）导入依赖 spring-cloud-starter-alibaba-sentinel
 *  2）下载sentinel控制台，并启动java -jar sentinel-dashboard.jar --server.port=10300
 *  3）配置sentinel控制台信息
 *  4）在控制台调整参数。【默认所有的流控设置保存在内存中，重启失效】
 *
 * 2、每个微服务导入 spring-boot-starter-actuator 进行实时监控
 *  1）配置 management.endpoints.web.exposure.include=/actuator/sentinel， 暴露的 endpoint 路径
 *
 * 3、配置 web 请求被流控后返回json
 *  1）{@link HelloSentinelConfig}
 *
 * 4、使用 Sentinel 保护 Feign 调用端
 *  1）导入依赖 spring-cloud-starter-openfeign
 *  2）配置文件打开 Sentinel 对 Feign 的支持：feign.sentinel.enabled=true
 *  3）Feign 接口配置 fallback {@link EchoService}
 *  4）调用方手动指定远程服务降级策略。远程服务被降级处理，触发 3）中定义的熔断回调
 *  5）超大流量的时候，必须牺牲一些远程服务。在服务提供方（远程服务）指定降级策略；
 *      提供方是在运行。但是不运行自己的业务逻辑，返回的是默认的熔断数据（限流的数据）
 *
 * 5、自定义受保护的资源
 *  1）代码方式 {@link CustomService} 使用 try-catch
 *  2）注解方式 {@link HelloService} @SentinelResource(value = "sayHello")
 *
 * 6、gateway 网关限流
 *  1）com.alibaba.cloud::spring-cloud-alibaba-sentinel-gateway
 *
 * @author lshaci
 * @since 1.0.0
 */
@SpringBootApplication
@EnableFeignClients("top.lshaci.learning.alibaba.cloud.sentinel.hello.feign")
public class SentinelHelloApplication {

    public static void main(String[] args) {
        SpringApplication.run(SentinelHelloApplication.class, args);
    }
}
